MAX7219 的特點:
對 SPI 傳輸協訂有興趣的讀者,可以參考 JIMI 陪你玩 ROBOT_SPI Function 205 的教學。
CS:Chip Select,當 Master 要與目標裝置溝通時,會將將該腳位拉成 LOW,訊息開始傳輸,結束後會將 CS 腳位拉成 HIGH,結束通訊。也就因 SPI 是透過 CS 來『確定』與那個裝置溝通,所以當系統上的裝置越多,CS 線路也就越多(MOSI、MISO、CLK仍共用)。
MOSI:英文為 Master Output Slave Input,也就是控制器發出訊息與 Slave 接收訊息的資料線。
MISO:英文為 Master Input Slave Output,此條線路為控制器接收來自 Slave 裝置訊息用。
CLK:Clock 線路,MOSI 或 MISO 資料線的參考時脈。
針對 WiFiBoy Python IoT 玩學機,您應該如此接線:
常見應用
在 MicroPython 1.23 的版本中,沒有內建驅動 max7219 的模組。在 github 上就有一個經常被 maker 引用的專案可以使用。
我們要把專案裡面的 max7219.py 下載下來,上傳到玩學機的 Flash。我們會習慣把外部引入的函式庫放到 lib 目錄中。請在根目錄建立一個 lib 目錄,然後將 max7219.py 黨放進去。
未來我們引用裡面的函數就只要寫底下這行,就可以用裡面內建的方法了:
from lib.max7219 import Matrix8x8
驅動程式的教學說明其實很簡略,經過筆者實際測試後,發覺需要經歷過三個階段:
WiFiBoy 有兩組 SPI 介面,不過第一組已經被內建的 LCD 使用,所以我們啟動 SPI 傳輸介面時要使用 第二組。這點非常重要,當初在寫測試程式時,花了很多時間在查文件。
繪圖語法規則,可以參考本日文章的後半段範例教學的註解說明。
我們先列出原始碼中,內建的相關方法:
# MAX7219 8x8 LED display Github 專案教學範例講解
# https://github.com/mcauser/micropython-max7219
# 初始設定,以 WiFiBoy 為例
from machine import Pin, SPI
import lib.max7219
from utime import sleep
# 定義接腳
CLOCK_PIN = 18
DATA_PIN = 23
CS_PIN = 5
# 初始化 SPI
spi0 = SPI(2, baudrate=10000000, polarity=0, phase=0, sck=Pin(CLOCK_PIN), mosi=Pin(DATA_PIN))
# 初始化 CS 腳位
cs = Pin(CS_PIN, Pin.OUT)
# 初始化 MAX7219 LED 矩陣
# ===============================================================
# 範例開始
# ===============================================================
# 我們使用四個串聯在一起的 MAX7210 模組,參數要設定為4
display = lib.max7219.Matrix8x8(spi0, cs, 4)
# ===============================================================
# 01. 顯示 12345678 在 (0, 0) 座標
# ===============================================================
# 因為只有四個模組,所以只會顯示1234。在(0,0)座標畫,最後一個1是點亮 LED
# display.text('12345678',0,0,1)
# ===============================================================
# 02. 關閉整個 LED ,即填入0 值
# ===============================================================
# display.fill(0)
# ===============================================================
# 03. 畫個 V 字
# ===============================================================
# display.pixel(0,0,1)
# display.pixel(1,1,1)
# display.pixel(2,2,1)
# display.pixel(3,1,1)
# display.pixel(4,0,1)
# ===============================================================
# 04. 畫水平與垂直線
# ===============================================================
# 因為我們使用四塊水平串聯,所以x軸有32點
# display.hline(0,4,32,1)
# display.vline(4,0,8,1)
# ===============================================================
# 05. 畫空心與實心矩形
# ===============================================================
# 在(17, 1) 這點畫一個邊長 6 點的空心正方形(座標從(0,0)開始)
# display.rect(17,1,6,6,1)
# 在(25, 1) 這點畫一個邊長 6 點的實心正方形
# display.fill_rect(25,1,6,6,1)
# ===============================================================
# 06. 顯示文字 Play
# ===============================================================
# display.fill(0)
# display.text('Play',0,0,1)
# ===============================================================
# 07. 文字捲動
# ===============================================================
# display.fill(0)
# display.text('12345678',0,0,1)
# display.scroll(-8,0) # 2344
# display.show() # 輸出 buffer 內容即繪出畫面。
# Max7219 範例_HelloWorld跑馬燈
from machine import Pin, SPI
import lib.max7219
from utime import sleep
CLOCK_PIN = 18
DATA_PIN = 23
CS_PIN = 5
spi0 = SPI(2, baudrate=10000000, polarity=0, phase=0, sck=Pin(CLOCK_PIN), mosi=Pin(DATA_PIN))
cs = Pin(CS_PIN, Pin.OUT)
matrix = lib.max7219.Matrix8x8(spi0, cs, 4)
# 顯示字串函數
def clear_display():
# 清除顯示內容
matrix.fill(0)
matrix.show()
def show_text(text, delay=0.1):
text_width = len(text) * 8
clear_display()
for offset in range(text_width + 32): # 32 是為了讓文字全部移出螢幕
clear_display()
for i in range(len(text)):
char = text[i]
# 計算字在螢幕上的起始位置
char_x = (i * 8) - offset
if -8 < char_x < 128: # 只顯示螢幕內的字串
matrix.text(char, char_x, 0, 1)
matrix.show()
sleep(delay)
# 執行跑馬燈程式
try:
while True:
show_text("Hello, WiFiBoy!")
except KeyboardInterrupt:
clear_display()